require('script-loader!file-saver');
import XLSX from 'xlsx-style'

function generateArray(table) {
	var out = [];
	var rows = table.querySelectorAll('tr');
	var ranges = [];
	for (var R = 0; R < rows.length; ++R) {
		var outRow = [];
		var row = rows[R];
		var columns = row.querySelectorAll('td');
		for (var C = 0; C < columns.length; ++C) {
			var cell = columns[C];
			var colspan = cell.getAttribute('colspan');
			var rowspan = cell.getAttribute('rowspan');
			var cellValue = cell.innerText;
			if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;

			//Skip ranges
			ranges.forEach(function(range) {
				if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
					for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
				}
			});

			//Handle Row Span
			if (rowspan || colspan) {
				rowspan = rowspan || 1;
				colspan = colspan || 1;
				ranges.push({
					s: {
						r: R,
						c: outRow.length
					},
					e: {
						r: R + rowspan - 1,
						c: outRow.length + colspan - 1
					}
				});
			};

			//Handle Value
			outRow.push(cellValue !== "" ? cellValue : null);

			//Handle Colspan
			if (colspan)
				for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
		}
		out.push(outRow);
	}
	return [out, ranges];
};

function datenum(v, date1904) {
	if (date1904) v += 1462;
	var epoch = Date.parse(v);
	return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}

function sheet_from_array_of_arrays(data, opts) {
	var ws = {};
	var range = {
		s: {
			c: 10000000,
			r: 10000000
		},
		e: {
			c: 0,
			r: 0
		}
	};
	for (var R = 0; R != data.length; ++R) {
		for (var C = 0; C != data[R].length; ++C) {
			if (range.s.r > R) range.s.r = R;
			if (range.s.c > C) range.s.c = C;
			if (range.e.r < R) range.e.r = R;
			if (range.e.c < C) range.e.c = C;
			var cell = {
				v: data[R][C]
			};
			if (cell.v == null) continue;
			var cell_ref = XLSX.utils.encode_cell({
				c: C,
				r: R
			});

			if (typeof cell.v === 'number') cell.t = 'n';
			else if (typeof cell.v === 'boolean') cell.t = 'b';
			else if (cell.v instanceof Date) {
				cell.t = 'n';
				cell.z = XLSX.SSF._table[14];
				cell.v = datenum(cell.v);
			} else cell.t = 's';

			ws[cell_ref] = cell;
		}
	}
	if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
	return ws;
}

function Workbook() {
	if (!(this instanceof Workbook)) return new Workbook();
	this.SheetNames = [];
	this.Sheets = {};
}

function s2ab(s) {
	var buf = new ArrayBuffer(s.length);
	var view = new Uint8Array(buf);
	for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
	return buf;
}
// 去最后一行空格
function isBorder(length,key) {
	if(key == 'A' + (5 + length) || key == 'B' + (5 + length) ||key == 'C' + (5 + length) ||key == 'D' + (5 + length) ||key == 'E' + (5 + length) ||key == 'F' + (5 + length) ||key == 'G' + (5 + length) ||key == 'H' + (5 + length)) {
		return true
	}else if(key == 'A' + (4 + length) || key == 'B' + (4 + length) ||key == 'C' + (4 + length) ||key == 'D' + (4 + length) ||key == 'E' + (4 + length) ||key == 'F' + (4 + length) ||key == 'G' + (4 + length) ||key == 'H' + (4 + length)){
		return true
	}else{
		return false
	}
}

export function export_table_to_excel(id) {
	var theTable = document.getElementById(id);
	var oo = generateArray(theTable);
	var ranges = oo[1];

	/* original data */
	var data = oo[0];
	var ws_name = "SheetJS";

	var wb = new Workbook(),
		ws = sheet_from_array_of_arrays(data);

	/* add ranges to worksheet */
	// ws['!cols'] = ['apple', 'banan'];
	ws['!merges'] = ranges;

	/* add worksheet to workbook */
	wb.SheetNames.push(ws_name);
	wb.Sheets[ws_name] = ws;

	var wbout = XLSX.write(wb, {
		bookType: 'xlsx',
		bookSST: false,
		type: 'binary'
	});

	saveAs(new Blob([s2ab(wbout)], {
		type: "application/octet-stream"
	}), "test.xlsx")
}

export function export_json_to_excel({
	title,
	multiHeader = [],
	header,
	time,
	data,
	filename,
	merges = [],
	autoWidth = true,
	bookType = 'xlsx',
	myRowFont = '1',
	wb,
	length
} = {}) {
	/* original data */
	filename = filename || 'excel-list'
	data = [...data]
	data.unshift(header);
	data.unshift(title);
	for (let i = multiHeader.length - 1; i > -1; i--) {
		data.unshift(multiHeader[i])
	}
	var ws_name = "SheetJS";
	// var wb = new Workbook();
	var ws = sheet_from_array_of_arrays(data);

	if (merges.length > 0) {
		if (!ws['!merges']) ws['!merges'] = [];
		merges.forEach(item => {
			ws['!merges'].push(XLSX.utils.decode_range(item))
		})
	}
	/*在这里修改列的宽度*/
	if (autoWidth) {
		let result = [
			{wch: 8},
			{wch: 20},
			{wch: 15},
			{wch: 15},
			{wch: 15},
			{wch: 15},
			{wch: 15},
			{wch: 15},
		]
		wb.Sheets[wb.SheetNames[0]]['!cols'] = result;
	}

	/* add worksheet to workbook */
	// wb.SheetNames.push(ws_name);
	// wb.Sheets[ws_name] = ws;
	var dataInfo = wb.Sheets[wb.SheetNames[0]];
	delete dataInfo.I1;
	dataInfo.A1.v =title;
	dataInfo.A2.v ='时间：' + time;
	console.log('wb',wb);

	const borderAll = { //单元格外侧框线
		top: {
			style: 'thin'
		},
		bottom: {
			style: 'thin'
		},
		left: {
			style: 'thin'
		},
		right: {
			style: 'thin'
		}
	};
	//给所以单元格加上边框
	for (var i in dataInfo) {
		if (i == '!ref' || i == '!merges' || i == '!cols') {
			
		
		} else {
			if(i == 'A1') {
				dataInfo[i + ''].s = {
					font: {
					    name: '宋体',
					    sz: 16,
					    color: {rgb: "000000"},
					    bold: false,
					    italic: false,
					    underline: false
					},
					alignment: {
						horizontal: "center",
						vertical: "center"
					},
				}
			}else if(isBorder(length,i)) {
				dataInfo[i + ''].s = {
					border: '',
					font: {
					    name: '宋体',
					    sz: 12,
					    color: {rgb: "000000"},
					    bold: false,
					    italic: false,
					    underline: false
					},
					alignment: {
						// horizontal: "center",
						// vertical: "center"
					},
				}
			}else{
				/*这里修改单元格的样式*/
				dataInfo[i + ''].s = {
					border:i == 'A2' ? '' : borderAll,
					font: {
					    name: '宋体',
					    sz: 12,
					    color: {rgb: "000000"},
					    bold: false,
					    italic: false,
					    underline: false
					},
					alignment: {
						// horizontal: "center",
						// vertical: "center"
					},
					
				}
			}
		}
	}
	
	// 去掉标题边框
	// let arr = ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1", "I1", "J1", "K1", "L1", "M1", "N1", "O1", "P1", "Q1", "R1",
	// 	"S1", "T1", "U1", "V1", "W1", "X1", "Y1", "Z1"
	// ];
	// arr.some(v => {
	//   console.log(v)
	//   let a = merges[0].split(':')
	//   console.log(a)
	//   if (v == a[1]) {
	//     console.log(dataInfo[v])
	//     dataInfo[v].s = {}
	//     return true;
	//   } else {
	//     console.log(dataInfo[v])
	//     dataInfo[v]
	//     dataInfo[v].s = {}
	//   }
	// })

	//设置主标题样式
	// dataInfo["A1"].s = {
	//   font: {
	//     name: '宋体',
	//     sz: 18,
	//     color: {rgb: "000000"},
	//     bold: true,
	//     italic: false,
	//     underline: false
	//   },
	//   alignment: {
	//     horizontal: "center",
	//     vertical: "center"
	//   },
	//   fill: {
	//     fgColor: {rgb: "fffffff"},
	//   },
	// };
	/*如果想单独修改样式
		 // 这是表头行的样式
  dataInfo["A2"].s = {
    border: borderAll,
    font: {
      name: '宋体',
      sz: 14,
      color: {rgb: "2A2A2A"},
      bold: true,
      italic: false,
      underline: false
    },
    alignment: {
      horizontal: "center",
      vertical: "center"
    },
    fill: {
      fgColor: {rgb: "ffffff"},
    },
  };
  dataInfo["B2"].s = {
    border: borderAll,
    font: {
      name: '宋体',
      sz: 14,
      color: {rgb: "2A2A2A"},
      bold: true,
      italic: false,
      underline: false
    },
    alignment: {
      horizontal: "center",
      vertical: "center"
    },
    fill: {
      fgColor: {rgb: "ffffff"},
    },
  };
*/
	// 这是表头行的样式
	// var tableTitleFont = {
	//   font: {
	//     name: '宋体',
	//     sz: 18,
	//     color: {rgb: "000000"},
	//     bold: true,
	//     italic: false,
	//     underline: false
	//   },
	//   alignment: {
	//     horizontal: "center",
	//     vertical: "center"
	//   },
	//   fill: {
	//     fgColor: {rgb: "008000"},
	//   },
	// };
	// for (var b in dataInfo) {
	//   if (b.indexOf(myRowFont) > -1) {
	//     dataInfo[b].s = tableTitleFont
	//   }
	// }
	//设置主标题样式
	// let style = {
	// 	// border: borderAll,
	// 	font: {
	// 		name: "宋体",
	// 		sz: 12,
	// 		color: {
	// 			rgb: "000000"
	// 		},
	// 		bold: true,
	// 		italic: false,
	// 		underline: false
	// 	},
	// 	alignment: {
	// 		horizontal: "center",
	// 		vertical: "center"
	// 	},

	// 	fill: {
	// 		fgColor: {
	// 			rgb: "ffffff"
	// 		},
	// 	},
	// };
	// excel标题样式
	// for (var i = 0; i < 7; i++) {
	// 	dataInfo[arr[i]].s = style;
	// }



	// console.log(merges);
	// console.log(dataInfo);

	var wbout = XLSX.write(wb, {
		bookType: bookType,
		bookSST: false,
		type: 'binary'
	});
	saveAs(new Blob([s2ab(wbout)], {
		type: "application/octet-stream"
	}), `${filename}.${bookType}`);
}
